const path = require('path');
const fs = require('fs');

/**
 * @description: 拷贝目录和文件
 * @return {src} 模板文件路径
 * @return {dst} 拷贝到项目目录下的路径
 * @return {callback} 执行对应的回调函数
 * @author: lg
 */

const checkdirectory = function (src, dst, callback) {
  fs.access(dst, fs.constants.f_ok, (err) => {
    if (err) {
      fs.mkdirSync(dst);
      callback(src, dst);
    } else {
      callback(src, dst);
    }
  });
};

module.exports = async (name, templateName) => {
  const sourceDir = path.join(__dirname, `../template/${templateName}`); // 模板文件路径
  const targetDir = path.join(process.cwd(), name); // 项目创建路径

  /**
   * @description 拷贝指定目录下的文件到指定目录
   * @param {string} sourcePath
   * @param {string} targetPath
   */
  const copy = function (src, dst) {
    let paths = fs.readdirSync(src); //同步读取当前目录
    paths.forEach(function (path) {
      const _src = src + '/' + path;
      const _dst = dst + '/' + path;
      fs.stat(_src, function (err, stats) {
        //stats 该对象 包含文件属性
        if (err) throw err;
        if (stats.isFile()) {
          //如果是个文件则拷贝
          let readable = fs.createReadStream(_src); //创建读取流
          let writable = fs.createWriteStream(_dst); //创建写入流
          readable.pipe(writable);
        } else if (stats.isDirectory()) {
          //是目录则 递归
          checkdirectory(_src, _dst, copy);
        }
      });
    });
  };

  checkdirectory(sourceDir, targetDir, copy);
};
